#pragma once 

#include <iostream>

#include "./util.hpp"
#include "./reactor.hpp"
#include "./io_callback_service.hpp"
#include "./sock.hpp"

int accepter(Event* p_ev)
{
    std::cout << "有新的链接到来了,就绪的sock是" << p_ev->_sock << std::endl;
    //因为可能有好几个链接同时到来,因为ET模式的原因,epoll只会通知一次,所以我们需要循环进行拿取链接
    while(true)
    {
        int sock = Sock::Accept(p_ev->_sock);
        if (sock < 0)
        {
            //这里有两种情况,一种是,底下没有链接可以进行获取,返回-1
            //还有可能是accept失败了(失败的情况还是比较少的),但是我们这里只能以<0进行判断,以没有链接作为循环结束的条件
            std::cout << "accept finish" <<std::endl;
            break;
        }
        std::cout << "accept success" << std::endl;
        set_non_block(sock);

        //这里就是获取成功了sock,就可以构建Event对象了
        Event* p_sock_event = new Event();
        p_sock_event->_sock = sock;

        //让Event指向自己所属的Reactor对象,为了Event进行回调函数时,回调函数需要用到Reactor对象,比如说里面的修改epoll监听对象的事件
        p_sock_event->_p_reactor = p_ev->_p_reactor;

        p_sock_event->register_callback(recver, sender, errorer);

        p_ev->_p_reactor->insert_event(p_sock_event, EPOLLET | EPOLLIN);
        
    }
    return 0;
}

